package controllers;

import play.*;
import play.mvc.*;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.*;

import models.*;

public class Application extends Controller {
	
	private static Connection con;  
	private static Statement comando;
	
	@Before(unless = {"index", "logar"}) //nenhuma outra página além dessas poderia ser aberta enquanto não logar
	public static void checkAutenticacao() throws SQLException {
		if (!session.contains("func") && !session.contains("client")) {
			index("Faça o login antes");
		}
	} 
	
	public static void mostrar_servico(String servico) throws SQLException
	{
	  int id = 0;
	  String aux = "",descricao="",msg="",estado="";
	  int i=0;
	  /*while(servico.charAt(i)!=' ')
	  {
		  aux = aux + servico.charAt(i);
		  i++;
	  }*/
	  id = Integer.parseInt(servico);
	  conectar();
	  ResultSet rs;
	  
	  rs = comando.executeQuery("select * from servico where id = "+id);
	  if(rs.next())
	  {
		  descricao = rs.getString("descricao");
		  msg = rs.getString("observacao");
		  estado = rs.getString("estado_id");
	  }
	  
	  rs = comando.executeQuery("select descricao from estado_servico where id = "+estado);
	  
	  if(rs.next())
	  {
		  estado = rs.getString("descricao");
	  }
	  
	  visualizar_servico(msg,descricao,estado,false);
	}
	
	public static void enviar_servico(String tipo, String descricao) throws SQLException
	{
		int tipo2 = 1;
		String cpf = "";
		conectar();
		ResultSet rs = comando.executeQuery("select id from tipo_servico where descricao = '"+tipo+"'");
    	if(rs.next())
    	{
    		tipo2 =Integer.parseInt(rs.getString("id"));
    	}
    	rs = comando.executeQuery("select cpf from usuario where login = '"+session.get("client")+"'");
    	if(rs.next())
    	{
    		cpf = rs.getString("cpf");
    	}
		comando.executeUpdate("insert into servico (cpf_usuario,tipo_id,estado_id,descricao,observacao) values('"+cpf+"',"+tipo2+",1,'"+descricao+"','')");
		solicitar_servico("Serviço cadastrado com sucesso!");
	}

	public static void Buscar_usuarios(String campo,String busca) throws SQLException
	    {
	    	List<String> resultado = new ArrayList<String>();
	    	conectar();
	    	ResultSet rs;

	    	if(campo.compareTo("tipo")!=0)
	    	{
	    		rs = comando.executeQuery("select cpf,nome from usuario where Upper("+campo+") like Upper('%"+busca+"%')");
	    		while(rs.next())
	    		{
	    			resultado.add(rs.getString("cpf")+" - "+rs.getString("nome"));
	    		}
	    		
	    	}else
	    	{
	    		rs = comando.executeQuery("select cpf,nome from usuario inner join tipo_usuario on usuario.tipo = tipo_usuario.tipo where Upper(tipo_usuario.descricao) like Upper('%"+busca+"%')");
	    		
	    		while(rs.next())
	    		{
	    			resultado.add(rs.getString("cpf")+" - "+rs.getString("nome"));
	    		}    	
	    	}
	    	
	    	busca_usuario(resultado);
	    }
	 
	public static void logar(String login, String senha) throws SQLException
    {
    	conectar();
      ResultSet rs;
    	
    	rs = comando.executeQuery("select login,senha,nome,telefone,endereco,tipo_usuario.descricao from usuario inner join tipo_usuario on usuario.tipo = tipo_usuario.tipo");
    	
    	while (rs.next()){
    		
    		if(rs.getString("login").compareTo(login)==0 && rs.getString("senha").compareTo(senha)==0)
    		{
    			
    			if(rs.getString("descricao").compareTo("Administrador")==0)
    			{
    				session.put("func", rs.getString("login"));   
    				perfil_func();
    			}else
    			{
    				session.put("client", rs.getString("login"));
    				perfil_cliente();
    			}
    		}    		
    	}
    	index("senha inválida!");
    	
    }
	
	public static void cadastrar(String nome,String cpf,String telefone,String endereco,String login,String senha,String senha2, String tipo) throws SQLException
	{
		int tipo2 = 0;
		
		
		if(nome.compareTo("") ==0)cadastro_usuario("*O campo nome é obrigatório",nome,cpf,telefone,endereco,login);
		else if(cpf.compareTo("") ==0)cadastro_usuario("*O campo CPF é obrigatório",nome,cpf,telefone,endereco,login);
		else if(telefone.compareTo("") ==0)cadastro_usuario("*O campo telefone é obrigatório",nome,cpf,telefone,endereco,login);
		else if(endereco.compareTo("") ==0)cadastro_usuario("*O campo endereco é obrigatório",nome,cpf,telefone,endereco,login);
		else if(login.compareTo("") ==0)cadastro_usuario("*O campo login é obrigatório",nome,cpf,telefone,endereco,login);
		else if(senha.compareTo("") ==0)cadastro_usuario("*O campo senha é obrigatório",nome,cpf,telefone,endereco,login);
		else if (senha2.compareTo(senha)!=0)cadastro_usuario("*senhas diferentes",nome,cpf,telefone,endereco,login);
		else
		{		
			conectar();
			ResultSet rs;    	
	    	rs = comando.executeQuery("select tipo from tipo_usuario where descricao = '"+tipo+"'");
	    	if(rs.next())
	    	{
	    		tipo2 =Integer.parseInt(rs.getString("tipo"));
	    	}
	    	
	    	comando.executeUpdate("insert into usuario values('"+login+"','"+senha+"',"+tipo2+",'"+nome+"','"+telefone+"','"+endereco+"','"+cpf+"')");

			cadastro_usuario(login+" cadastrado com sucesso","","","","","");
		}
	}
	
	public static void sair() throws SQLException
	{
	    	if(session.contains("func"))session.remove("func");
	    	else session.remove("client");
	    	index("");
	}
	
	private static void conectar() throws SQLException {  
	      
  	  
		try {
			Class.forName("org.postgresql.Driver");
		} catch (ClassNotFoundException e) {
		}
	
			con = DriverManager.getConnection(  
			        "jdbc:postgresql://localhost:5432/banco_manutencao",  
			        "site",  
			        "123456");
			comando =  con.createStatement();

	}
	
/*************************************************************************/    
/******************     RENDERIZAÇÕES DAS TELAS     **********************/
/*************************************************************************/
	
	public static void index(String msg) throws SQLException {

        if(session.contains("func"))perfil_func();
    	else if(session.contains("client"))perfil_cliente();
    	render(msg);
    }
   
    public static void perfil_cliente() throws SQLException
    {
	   String nome="", tipo="", usuario="", telefone="", endereco="";
	   conectar();
	   ResultSet rs;
	    	
	   rs = comando.executeQuery("select login,senha,nome,telefone,endereco,tipo_usuario.descricao from usuario inner join tipo_usuario on usuario.tipo = tipo_usuario.tipo where login ='"+session.get("client")+"'");
	    	
	   if(rs.next())
	   {
		   nome = rs.getString("nome");
		   tipo = rs.getString("descricao");
		   usuario = rs.getString("login");
		   telefone = rs.getString("telefone");
		   endereco = rs.getString("endereco");
	   }
	   render(nome,tipo,usuario,telefone,endereco);
    }
   
    public static void perfil_func() throws SQLException
    {
	   String nome="", tipo="", usuario="", telefone="", endereco="";
	   conectar();
	   ResultSet rs;
	    	
	   rs = comando.executeQuery("select login,senha,nome,telefone,endereco,tipo_usuario.descricao from usuario inner join tipo_usuario on usuario.tipo = tipo_usuario.tipo where login ='"+session.get("func")+"'");
	    	
	   if(rs.next())
	   {
		   nome = rs.getString("nome");
		   tipo = rs.getString("descricao");
		   usuario = rs.getString("login");
		   telefone = rs.getString("telefone");
		   endereco = rs.getString("endereco");
	   }
	   render(nome,tipo,usuario,telefone,endereco);
    }
    
    public static void cadastro_usuario(String msg,String nome,String cpf,String telefone,String endereco,String login) throws SQLException
    {
	   List<String> tipos = new ArrayList<String>();
	   conectar();
	   ResultSet rs;
	   rs = comando.executeQuery("select descricao as tipo from tipo_usuario order by tipo_usuario.tipo");
	   while(rs.next())
	   {
		   tipos.add(rs.getString("tipo"));
	   }
	   render(tipos,msg,nome,cpf,telefone,endereco,login);
    }
    
    public static void busca_usuario(List<String> resultado)
    {
    	render(resultado);
    }

    public static void solicitar_servico(String msg) throws SQLException
    {
    	List<String> tipos = new ArrayList<String>();
 	   conectar();
 	   ResultSet rs;
 	   rs = comando.executeQuery("select descricao as tipo from tipo_servico order by id");
 	   while(rs.next())
 	   {
 		   tipos.add(rs.getString("tipo"));
 	   }
    	render(tipos,msg);
    }

    public static void visualizar_servico(String msg,String descricao,String estado,boolean nselecionado) throws SQLException{
    	List<String> servicos = new ArrayList<String>();
    	String cpf="",id="",tipo="";
    	conectar();
    	ResultSet rs;
    	rs = comando.executeQuery("select cpf from usuario where login = '"+session.get("client")+"'");
    	
    	if(rs.next())
    	{
    		cpf = rs.getString("cpf");
    	}

    	Statement aux =comando;
    	rs = aux.executeQuery("select servico.id, servico.tipo_id from servico inner join usuario on usuario.cpf = servico.cpf_usuario where usuario.cpf = '"+cpf+"'");
    	conectar();
    	
    	while(rs.next())
    	{
    		id = rs.getString("id");
    		tipo = rs.getString("tipo_id");
    		ResultSet rs2 = comando.executeQuery("select descricao from tipo_servico where id = "+tipo);
    		rs2.next();
    		tipo = rs2.getString("descricao");
    		servicos.add(id+" - "+tipo);
    	}
    	render(nselecionado,servicos,msg,descricao,estado);
    }
}